package org.utils

import java.util.regex.Pattern

/**
 * 工具类：用于生成部署相关的路径与文件名
 */
class ArtifactUtils {

    private static final Pattern VERSION_PATTERN = ~/^\d+(\.\d+)*$/

    /**
     * 根据任务名、版本号和系统标识生成压缩包文件名
     *
     * @param jobName Jenkins 任务名称
     * @param version 构建版本号（如 "1.0.0.1"）
     * @param system 系统标识（如 "linux", "windows"，可为空）
     * @param compressionType 压缩类型（支持 "tar.gz", "zip", 默认为 "tar.gz"）
     * @return 生成的压缩包文件名
     */
    static String generateTarFileName(String jobName, String version, String system, String compressionType = "tar.gz") {
        assertValidJobName(jobName)
        assertValidVersion(version)

        def baseName = "${jobName}-${version}"
        if (system?.trim()) {
            baseName += "-${system}"
        }

        def ext = compressionType in ["tar.gz", "zip"] ? compressionType : "tar.gz"
        return "${baseName}.${ext}"
    }

    /**
     * 提取版本号的前三位作为目录名
     *
     * @param version 版本号字符串
     * @return 前三位版本号组成的字符串
     */
    static String extractVersionPrefix(String version) {
        assertValidVersion(version)

        def parts = version.split("\\.")
        return parts[0..2].join(".")
    }

    /**
     * 构造远程服务器上的部署目录路径
     *
     * @param jobName Jenkins 任务名称
     * @param deployPath 部署根路径
     * @param version 构建版本号
     * @return 远程部署目录路径
     */
    static String buildRemoteDirectory(String jobName, String deployPath, String version) {
        assertValidJobName(jobName)
        assertValidVersion(version)
        assert deployPath && new File(deployPath).isAbsolute() : "deployPath must be a valid absolute path"

        def versionPrefix = extractVersionPrefix(version)
        return "${deployPath}/${jobName}/${versionPrefix}"
    }

    // -------------------
    // 私有辅助方法
    // -------------------

    private static void assertValidJobName(String jobName) {
        assert jobName && jobName.trim() != "" : "jobName cannot be null or blank"
    }

    private static void assertValidVersion(String version) {
        assert version != null && VERSION_PATTERN.matcher(version).find() : "Invalid version format: ${version}"
    }
}